//数组的初识
//数组：可以看成是相同类型元素的一个集合。
public class TestDemo {
    public static void main1(String[] args) {
        //数组定义1
        int[] array = {1,2,3,4};

        //int[]是整型数组，array是数组变量（名）
        //则下标为 0 1 2 3
        //数组定义2
        int[] array2 = new int[10];//这种定义是属于定义了一个大小为10的整型数组
        //上述初始化为动态初始化：通过new关键字
        //在C语言中，数组通常会是随机值，但是在Java中，这么定义，数组中会是0；

        //数组定义3
        int[] array3 = new int[]{1,2,3,4,5,7};//这种定义是指的是给数组进行赋值之后那么等号后面的int[]中的[]不能进行空间的大小的填写
        //上述初始化为静态初始化：
        //静态初始化虽然没有指定数组的长度，编译器在编译时会根据{}中元素个数来确定数组的长度。
        //静态初始化时, {}中数据类型必须与[]前数据类型一致。
        //静态初始化可以简写，省去后面的new T[]。

        //实际中我们不用管那么多，直接写就可以了

        //静态和动态初始化也可以分为两步，但是省略格式不可以
        int[] array1;
        array1 = new int[10];
        int[] array4;
        array4 = new int[]{10, 20, 30};

        //但是我们不可以分两步直接进行赋值
        //如：
//        int[] array5;
//        array5 = {1,2,3,4,5,6};
        //这种会报错，
        //只能在定义是同时赋值

        System.out.println(array);
        System.out.println(array2);
        System.out.println(array3);
        //打印出来是“地址”，但是他不是真正的地址，他是哈希值，Java太安全了，但是这个哈希值也是唯一的
        //[I@1b6d3586
        //[I@4554617c
        //[I@74a14482
        //[数组类型，I为整形

        //这些地址是放在堆上
        //引用变量 --> 储存”地址“的变量。
    }

    // 如果没有对数组进行初始化，数组中元素有其默认值
    // 如果数组中存储元素类型为基本类型，默认值为基类类型对应的默认值，比如：
    public static void main2(String[] args) {
        char[] array1 = new char[10];
        double[] array3 = new double[10];
        float[] array4 = new float[10];
        boolean[] array5 = new boolean[10];
        //布尔初始化，值全为初始化为false
        String[] string = new String[10];
        //string类型数组初始化全为null
    }

    //数组的使用
    public static void main3(String[] args) {
        int[]array = new int[]{1, 2, 3, 4};
        array[0] = 100;//可以直接而对于某一项那个值去修改
        System.out.println(array[0]);
        System.out.println(array[1]);
        System.out.println(array[2]);
        System.out.println(array[3]);

        System.out.println(array[4]);
        //数组没有第五个元素，所以下标4就代表越界访问
//        Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
//        at TestDemo.main(TestDemo.java:69)
//        Disconnected from the target VM, address: '127.0.0.1:49482', transport: 'sock
        //这个异常是代表数组越界访问的异常

        //System.out.println(array.length);
        //C语言中得用sizeof来计算数组的长度，Java不用
        //int sz = sizeof(array) / sizoef(array[0]);//数组的长度
    //注意事项：
//        1. 数组是一段连续的内存空间，因此支持随机访问，即通过下标访问快速访问数组中任意位置的元素
//        2. 下标从0开始，介于[0, N）之间不包含N，N为元素个数，不能越界，否则会报出下标越界异常。
    }

    public static void main(String[] args) {

        int[] array1 = new int[]{1,2,3,4,5,6,7,8};
        //数组的遍历
       for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + " ");
        }
        System.out.println();//换行回车

        //范围for语法for each
        //这种语法我们拿不到数组元素的下标
        for (int x: array1) {
            System.out.print(x+" ");
        }
        System.out.println();
    }
    //对于下标的依赖，看情况和个人
}
